# 巡检定时任务
# 工作日 每天 --> 9:00 13:30 16:35 21:00
import datetime
import os
import shutil
import sys
import time

from apscheduler.schedulers.blocking import BlockingScheduler

# 当前时间
# cmd python命令执行该脚本时，出现ModuleNotFoundError，需要将父级目录作为资源目录查找common.send_mail
sys.path.append('.')
from common.mail_util import MailUtil
from common import device_util
from config.constants import Constants


def currentTime():
    return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")


def currentTime2():
    return datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S")


def plan():
    print("开始执行巡检计划：", currentTime())

    # 检查设备连接状态
    is_connected = device_util.isDevicesConnected()
    # 设备连接异常，重启adb服务
    if not is_connected:
        device_util.restartADBServer()
        is_connected = device_util.isDevicesConnected()
        # 重启后连接异常，发送邮件通知
        if not is_connected:
            mail_util = MailUtil()
            print("---无法进行自动化测试，请检查手机连接状态---")
            mail_util.sendDeviceDisconnectedMail()
            return

    # 设备连接正常
    root_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
    test_path = os.path.join(root_path, "cases")

    path_dir = os.path.join(root_path, "report")
    report_zip = os.path.join(root_path, "report_zip")
    path_zip = os.path.join(report_zip, "report-" + currentTime2() + ".zip")

    # 判断 report 文件夹是否存在，存在则删除
    if os.path.exists(path_dir):
        shutil.rmtree(path_dir)

    # 创建新的文件夹
    os.makedirs(path_dir)
    os.makedirs(report_zip, exist_ok=True)

    # 执行脚本并生成报告 当前脚本设置为根目录运行，不需要返回上一级
    report_html = os.path.join(path_dir, "report.html")
    if Constants.IS_DEBUG:
        # -sv 控制台输出详细日志（报告中不显示）
        os.system("pytest -sv " + test_path + " --html=" + report_html + " --self-contained-html")
    else:
        os.system("pytest " + test_path + " --html=" + report_html + " --self-contained-html")
    time.sleep(3)

    # debug时只看报告
    if Constants.IS_DEBUG:
        return

    if os.path.exists(path_dir):
        if len(os.listdir(path_dir)) == 0:
            print("安卓自动化测试失败，未生成测试报告！")
        else:
            # 压缩报告目录
            mail_util = MailUtil()
            mail_util.zipDir(path_dir, path_zip)
            time.sleep(3)
            # 发送带压缩报告目录的邮件
            mail_util.sendAttachMail("安卓自动化测试报告", "今日测试报告见附件", path_zip)
    else:
        print("安卓自动化测试失败，report目录不存在:" + path_dir)


def inspect_plan():
    # 创建调度器：BlockingScheduler
    scheduler = BlockingScheduler(timezone='Asia/Shanghai')
    scheduler.add_job(plan, 'cron', day_of_week='0-4', hour=9, minute=0)
    scheduler.add_job(plan, 'cron', day_of_week='0-4', hour=13, minute=30)
    scheduler.add_job(plan, 'cron', day_of_week='0-4', hour=16, minute=35)
    scheduler.add_job(plan, 'cron', day_of_week='0-4', hour=21, minute=0)
    scheduler.start()


# __name__ 当前执行模块的名称（区分立即执行和import执行）
if __name__ == "__main__":
    if Constants.IS_DEBUG:
        plan()
    else:
        # 是否开启巡检计划
        # 执行巡检计划：true-是，false-执行单次巡检
        if len(sys.argv) == 1:
            setup_inspect_plan = 'True'
        else:
            setup_inspect_plan = sys.argv[1]

        if setup_inspect_plan == 'True':
            # 执行巡检计划
            print("开启巡检计划：", currentTime())
            print("开启巡检计划: 工作日 每天 --> 9:00 13:30 16:35 21:00")
            inspect_plan()
        else:
            print("开始巡检：", currentTime())
            plan()